今天要來學習node.js的核心模組
先來講講模組(modules)是什麼:
模組其實就是一個js檔案,每個模組都有不同的單一的功能,他們都有著共同的特性:
- 封裝性:模組中的變量和函數是封裝的,外部無法直接訪問,除非你通過模組的接口(exports或module.exports)將它們導出。
- 重用性:模組可以被其他文件或應用導入並使用,從而實現代碼的重用。
- 獨立性:模組可以單獨進行測試和維護,降低開發的複雜性。
模組也被分為三個類型:
- 核心模組:Node.js內建的模組,例如http、fs、path和events。這些模組可以直接使用,無需安裝。
- 第三方模組:社區開發者創建的模組,可以通過NPM安裝並使用,例如express、lodash等。
- 自定義模組:開發者自己創建的模組,用於分割應用程式的代碼。
今天就會來了解核心模組的其中幾個:https、fs、path、events
http模組用於創建HTTP伺服器和處理HTTP請求。
http.createServer()
,用於創建一個http伺服器const http = require('http');
const server = http.createServer((req, res) => {
// req 是來自客戶端的請求對象
// res 是伺服器發送回應的對象
res.statusCode = 200; // 設置狀態碼
res.setHeader('Content-Type', 'text/plain'); // 設置響應標頭
res.end('Hello, World!\n'); // 發送響應內容
});
server.listen(port, hostname, () => {
console.log(`伺服器運行在 http://${hostname}:${port}/`);
});
http.request()
和 http.get()
,request用於發送 HTTP 請求、get是 http.request() 的簡化版本,適合用於發送 GET 請求。const options = {
hostname: 'www.example.com',
port: 80,
path: '/path',
method: 'GET'
};
const req = http.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(`回應內容: ${data}`);
});
});
req.on('error', (e) => {
console.error(`發生錯誤: ${e.message}`);
});
req.end();
http.get()的語法:
const url = 'http://www.example.com/path';
http.get(url, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(`回應內容: ${data}`);
});
}).on('error', (e) => {
console.error(`發生錯誤: ${e.message}`);
});
fs模組提供文件系統操作,如讀取、寫入和刪除文件。
const fs = require('fs');
fs.readFile('example.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
同步讀取:使用 fs.readFileSync() 來同步地讀取文件內容,這會阻塞程序直到文件讀取完成。
const fs = require('fs');
const data = fs.readFileSync('example.txt', 'utf8');
console.log(data);
const fs = require('fs');
fs.writeFile('example.txt', 'Hello, Node.js!', (err) => {
if (err) throw err;
console.log('文件已寫入');
});
同步寫入:使用 fs.writeFileSync() 來同步地寫入文件。
const fs = require('fs');
fs.writeFileSync('example.txt', 'Hello, Node.js!');
console.log('文件已寫入');
const fs = require('fs');
fs.appendFile('example.txt', '追加的內容', (err) => {
if (err) throw err;
console.log('內容已追加');
});
const fs = require('fs');
fs.unlink('example.txt', (err) => {
if (err) throw err;
console.log('文件已刪除');
});
同步刪除:使用 fs.unlinkSync() 來同步地刪除文件。
const fs = require('fs');
fs.unlinkSync('example.txt');
console.log('文件已刪除');
const fs = require('fs');
fs.readdir('myDirectory', (err, files) => {
if (err) throw err;
console.log(files);
});
同步列出:使用 fs.readdirSync() 同步地列出目錄內容。
const fs = require('fs');
const files = fs.readdirSync('myDirectory');
console.log(files);
const fs = require('fs');
fs.mkdir('newDirectory', (err) => {
if (err) throw err;
console.log('目錄已創建');
});
刪除目錄:使用 fs.rmdir() 刪除空目錄。
const fs = require('fs');
fs.rmdir('oldDirectory', (err) => {
if (err) throw err;
console.log('目錄已刪除');
});
path模組用於處理和轉換文件路徑。
const path = require('path');
const fullPath = path.join('folder', 'subfolder', 'file.txt');
console.log(fullPath); // 輸出: 'folder/subfolder/file.txt'(在 Windows 上可能是 'folder\subfolder\file.txt')
const path = require('path');
const absolutePath = path.resolve('folder', 'subfolder', 'file.txt');
console.log(absolutePath); // 輸出: 絕對路徑,如 '/home/user/folder/subfolder/file.txt'
const path = require('path');
const normalizedPath = path.normalize('folder//subfolder/../file.txt');
console.log(normalizedPath); // 輸出: 'folder/file.txt'
const path = require('path');
const baseName = path.basename('/folder/subfolder/file.txt');
console.log(baseName); // 輸出: 'file.txt'
const baseNameWithoutExt = path.basename('/folder/subfolder/file.txt', '.txt');
console.log(baseNameWithoutExt); // 輸出: 'file'
const path = require('path');
const dirName = path.dirname('/folder/subfolder/file.txt');
console.log(dirName); // 輸出: '/folder/subfolder'
const path = require('path');
const extName = path.extname('/folder/subfolder/file.txt');
console.log(extName); // 輸出: '.txt'
const path = require('path');
const parsedPath = path.parse('/folder/subfolder/file.txt');
console.log(parsedPath);
// 輸出: {
// root: '/',
// dir: '/folder/subfolder',
// base: 'file.txt',
// ext: '.txt',
// name: 'file'
// }
const path = require('path');
const formattedPath = path.format({
root: '/',
dir: '/folder/subfolder',
base: 'file.txt',
ext: '.txt',
name: 'file'
});
console.log(formattedPath); // 輸出: '/folder/subfolder/file.txt'
events模組提供事件驅動編程的支持,讓你可以創建和觸發自定義事件。
EventEmitter 是 events 模組提供的主要類別,它允許你創建和管理事件。
const EventEmitter = require('events');
const myEmitter = new EventEmitter();
myEmitter.on('eventName', (data) => {
console.log('事件發生,數據:', data);
});
myEmitter.emit('eventName', data);
myEmitter.removeListener('eventName', handler);
myEmitter.off('eventName', handler); // `off` 是 `removeListener` 的別名
// 移除所有處理程序
myEmitter.removeAllListeners('eventName');
myEmitter.setMaxListeners(n);
今天就先看到這邊,今天的字數超級多(其實我很多都是跟chatGPT參考過來的)但是我覺得這樣總比翻看一堆文章之後找不到重點還要好。今天知道這些基本的模組之後,明天就可以先來建立一個簡單的應用了。